﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace LOGIC
{   /// Logisk klass för hantering av skidlektioner
    public class LogicSkiclass
    {
        private DB.GruppLektion groupLesson = new DB.GruppLektion();
        private DB.Privatlektion privateLesson = new DB.Privatlektion();
        
        public LogicSkiclass()
        {
        }

        private LogicSession session;
        public LogicSkiclass(LogicSession session)
        {
            this.session = session;
        }

        /// Get Metoder
        #region

        public int GruppLektionsId
        {
            get { return groupLesson.gruppLekID; }
        }

        public string GruppLektionsTyp
        {
            get { return groupLesson.gruppTyp; }
        }

        public string GruppLektionsPeriod
        {
            get { return groupLesson.period; }
        }

        public int GruppLektionsPris
        {
            get { return (int)groupLesson.pris; }
        }

        public int GruppLektionsAntal
        {
            get { return (int)groupLesson.maxAntal; }
        }

        public int PrivatLektionsId
        {
            get { return privateLesson.privatLekID; }
        }

        public int PrivatLektionsPris
        {
            get { return privateLesson.pris; }
        }

        #endregion

        /// <summary>
        /// Returnerar metod för att visa samtliga skidlektioner för grupp (Mån-Ons)
        /// </summary>
        /// <returns></returns>
        public IQueryable GetSkiClassShort()
        {
            return LogicSession.TheSession.Db.GetSkiGroupLessonShort();
        }

        /// <summary>
        /// Returnerar metod för att visa samtliga skidlektioner för grupp (Mån-Fre)
        /// </summary>
        /// <returns></returns>
        public IQueryable GetSkiClassLong()
        {
            return LogicSession.TheSession.Db.GetSkiGroupLessonLong();
        }

        /// <summary>
        /// Returnerar metod för att visa samtliga skidlektioner (privat) för vald dag
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public IQueryable GetSkiClassPri(string day)
        {
            return LogicSession.TheSession.Db.GetSkiLessonPrivate(day);
        }

        /// <summary>
        /// Metod för att lägga till en ny skidbokning för företag
        /// </summary>
        /// <param name="gästNr"></param>
        /// <param name="staffId"></param>
        /// <param name="name"></param>
        public static void NewSkiBookCo(int gästNr, int staffId, string name, int price)
        {
            LogicSession.TheSession.Db.NewSkiBookCompany(gästNr, staffId, name, price);
        }

        /// <summary>
        /// Metod för att lägga till en ny skidbokning för privat
        /// </summary>
        /// <param name="staffId"></param>
        /// <param name="name"></param>
        public static void NewSkiBookPri(int staffId, string name, int price)
        {
            LogicSession.TheSession.Db.NewSkiBookPrivate(staffId, name, price);
        }

        /// <summary>
        /// Metod för att lägga till en ny skidbokningsrad för företag
        /// </summary>
        /// <param name="bookId"></param>
        /// <param name="lesId"></param>
        /// <param name="name"></param>
        /// <param name="price"></param>
        /// <param name="week"></param>
        public static void NewSkiGroupRow(int bookId, int lesId, string name, int price, string week)
        {
            LogicSession.TheSession.Db.NewSkiGroupRow(bookId, lesId, name, price, week);
        }

        /// <summary>
        /// Metod för att lägga till en ny skidbokningsrad för privat
        /// </summary>
        /// <param name="bookId"></param>
        /// <param name="lesId"></param>
        /// <param name="name"></param>
        /// <param name="price"></param>
        /// <param name="week"></param>
        public static void NewSkiPrivateRow(int bookId, int lesId, string name, int price, string week)
        {
            LogicSession.TheSession.Db.NewSkiPrivateRow(bookId, lesId, name, price, week);
        }

        /// <summary>
        /// Returnerar metod som hämtar senaste skidbokningsnumret
        /// </summary>
        /// <returns></returns>
        public int GetSkiBookNr()
        {
            return LogicSession.TheSession.Db.GetSkiBookNumber();
        }

        /// <summary>
        /// Returnerar metod som hämtar samtliga skidlektioner (grupp)
        /// </summary>
        /// <returns></returns>
        public IQueryable GetGroupLesson()
        {
            return LogicSession.TheSession.Db.GetGroupLesson();
        }

        /// <summary>
        /// Returnerar metod som hämtar samtliga skidlektioner (privat)
        /// </summary>
        /// <returns></returns>
        public IQueryable GetPrivateLessons()
        {
            return LogicSession.TheSession.Db.GetPrivateLesson();
        }

        /// <summary>
        /// Returnerar metod för att visa hur många lediga skidlektioner för grupp det finns nuvarande vecka
        /// </summary>
        /// <param name="weekNr"></param>
        /// <returns></returns>
        public List<string> GetSkiClassAttenders(int weekNr)
        {
            return LogicSession.TheSession.Db.GetAttenders(weekNr);
        }

        /// <summary>
        /// Returnerar metod för att visa om skidlektioner (privat) är bokad eller ledig för vald dag
        /// </summary>
        /// <param name="day"></param>
        /// <param name="week"></param>
        /// <returns></returns>
        public List<string> GetSkiPriFree(string day, int week)
        {
            return LogicSession.TheSession.Db.GetPrivateAttenders(day, week);
        }

        /// <summary>
        /// Metod som kollar antalet lediga grupplektioner
        /// </summary>
        /// <param name="id"></param>
        /// <param name="week"></param>
        /// <returns></returns>
        public bool CheckAvailableGroup(int id, int week, string[] reserved)
        {
            int booked = LogicSession.TheSession.Db.CheckAvailableGroup(id, week); // Kollar bokade grupplektioner
            string[] bookSplit;

            for (int i = 0; i < reserved.Length; i++) // Kollar reserverade grupplektioner
            {
                bookSplit = reserved[i].Split(':', ' ');
                if (bookSplit[3] == id.ToString())
                {
                    booked += 1;
                }
            }

            if (booked >= LogicSession.TheSession.Db.GetMaxAttenders())
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Metod som kollar antalet lediga privatlektioner
        /// </summary>
        /// <param name="id"></param>
        /// <param name="week"></param>
        /// <returns></returns>
        public bool CheckAvailablePri(int id, int week)
        {
            int booked = LogicSession.TheSession.Db.CheckAvailablePri(id, week);
            
            if (booked > 0) // Kollar om lektionsid är bokat
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Returnerar metod för att hämta ID nummer för en skidlektion efter vald typ och period
        /// </summary>
        /// <param name="type"></param>
        /// <param name="period"></param>
        /// <returns></returns>
        public List<string> GetSkiLesId(string type, string period)
        {
            return LogicSession.TheSession.Db.GetSkiLessonId(type, period);
        }

        /// <summary>
        /// Returnerar metod för att hämta pris för en skidlektion efter vald typ och period
        /// </summary>
        /// <param name="type"></param>
        /// <param name="period"></param>
        /// <returns></returns>
        public List<string> GetSkiLesPrice(string type, string period)
        {
            return LogicSession.TheSession.Db.GetSkiLessonPrice(type, period);
        }

        /// <summary>
        /// Returnerar metod för att hämta pris för en skidlektion efter valt ID nummer
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public List<string> GetSkiLesPrice(string id)
        {
            return LogicSession.TheSession.Db.GetSkiLessonPrice(id);
        }

        /// <summary>
        /// Returnerar metod som kollar om vald grupp finns lagrad i databasen
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public bool CheckGroup(string type)
        {
            return LogicSession.TheSession.Db.CheckGroup(type);
        }

        /// <summary>
        /// Returnerar metod som kollar om vald period finns lagrad i databasen
        /// </summary>
        /// <param name="period"></param>
        /// <returns></returns>
        public bool CheckPeriod(string period)
        {
            return LogicSession.TheSession.Db.CheckPeriod(period);
        }

        /// <summary>
        /// Returnerar metod som kollar om valt ID nummer finns lagrad i databasen
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool CheckId(string id)
        {
            return LogicSession.TheSession.Db.CheckId(id);
        }

        /// <summary>
        /// Metod som kollar att inte samma person kan bokas för samma skidlektion
        /// </summary>
        /// <param name="id"></param>
        /// <param name="fName"></param>
        /// <param name="lName"></param>
        /// <param name="reserved"></param>
        /// <returns></returns>
        public bool CheckIfGuestExists(string id, string fName, string lName, string[] reserved)
        {
            bool temp = true;
            string[] resSplit;

            for (int i = 0; i < reserved.Length; i++)
            {
                resSplit = reserved[i].Split(':', ' ');
                if (resSplit[3] == id && resSplit[6] == fName && resSplit[7] == lName)
                {
                    temp = false;
                }
            }

            return temp;
        }

        /// <summary>
        /// Metod som kollar att max två personer bokas för samma skidlektion (privat)
        /// </summary>
        /// <param name="tempId"></param>
        /// /// <param name="reserved"></param>
        /// <returns></returns>
        public bool CheckIfLesExists(string tempId, string[] reserved)
        {
            int maxTwo = 0;
            string[] resSplit;

            for (int i = 0; i < reserved.Length; i++)
            {
                resSplit = reserved[i].Split(':',' ');
                if (resSplit[3] == tempId)
                {
                    maxTwo += 1;
                }
            }

            if (maxTwo == 2) // Om samma ID hittats två gånger, returnera false annars true
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Metod som kollar om det är privat- eller företagsgäst som vill boka skidlektion
        /// </summary>
        /// <param name="details"></param>
        /// <returns></returns>
        public bool CheckPrivateOrCompany(string[] details)
        {
            if (details.Length > 13) // Privat = 13, Företag = 14;
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Metod som kollar om det är grupp- eller privatlektion som bokats
        /// </summary>
        /// <param name="details"></param>
        /// <returns></returns>
        public bool CheckPrivateOrGroup(string[] details)
        {
            if (details[0].StartsWith("Grupp")) // Grupp eller privatlektion
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Metod för att hämta nuvarande veckonummer
        /// </summary>
        /// <returns></returns>
        public int GetWeekNr()
        {
            CultureInfo culture = CultureInfo.CurrentCulture;
            int weekNr = culture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);

            return weekNr;
        }

        /// <summary>
        /// Metod för att ändra skidlektioner (grupp)
        /// </summary>
        /// <param name="tempId"></param>
        /// <param name="tempPeriod"></param>
        /// <param name="tempLevel"></param>
        /// <param name="tempPrice"></param>
        public static void ChangedGroupLesson(int tempId, string tempPeriod, string tempLevel, int tempPrice)
        {
            LogicSession.TheSession.Db.ChangedGroupLesson(tempId, tempPeriod, tempLevel, tempPrice);
        }

        /// <summary>
        /// Metod för att ändra skidlektioner (privat)
        /// </summary>
        /// <param name="tempId"></param>
        /// <param name="tempPrice"></param>
        public static void ChangedPrivateLesson(int tempId,int tempPrice)
        {
            LogicSession.TheSession.Db.ChangedPrivateLesson(tempId,tempPrice);
        }

        /// <summary>
        /// Metod för att hämta privatlektions deltagarna för dagen.
        /// </summary>
        /// <param name="day">Dagensdatum</param>
        /// <param name="week">Innevarande vecka</param>
        /// <returns></returns>
        public List<string> GetPrivateLessonAttend(string day, string week)
        {
            List<string> attendNames = LogicSession.TheSession.Db.GetPrivateLessonNames(day, week);
            return attendNames; 
        }

        /// <summary>
        /// Metod för att hämta grupplektions deltagarna för vald grupp och period.
        /// </summary>
        /// <param name="week">Innevarande vecka</param>
        /// <param name="period">Period (Mån-Ons eller Mån-Fre)</param>
        /// <param name="groups">Grupp (grön, blå, röd, svart)</param>
        /// <returns></returns>
        public List<string> GetGroupLessonAttend(string week, string period, string groups)
        {
            List<string> attendNames = LogicSession.TheSession.Db.GetGroupLessonNames(week, period, groups);
            return attendNames;
        }

    }
}
